//package com.xw.base.annotation;
//
//import com.xw.base.entity.annotation.AutoIncreaseInfo;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.data.mongodb.core.FindAndModifyOptions;
//import org.springframework.data.mongodb.core.MongoTemplate;
//import org.springframework.data.mongodb.core.mapping.event.AbstractMongoEventListener;
//import org.springframework.data.mongodb.core.mapping.event.BeforeConvertEvent;
//import org.springframework.data.mongodb.core.query.Criteria;
//import org.springframework.data.mongodb.core.query.Query;
//import org.springframework.data.mongodb.core.query.Update;
//import org.springframework.stereotype.Component;
//import org.springframework.util.ReflectionUtils;
//
//
///**
// * @author xiongwei_vendor
// * @date 2020-7-14
// */
//@Component
//public class SaveMongoEventListener extends AbstractMongoEventListener<Object> {
//
//    @Autowired
//    private MongoTemplate mongoTemplate;
//
//    @Override
//    public void onBeforeConvert(BeforeConvertEvent<Object> event) {
//        final Object source = event.getSource();
//        ReflectionUtils.doWithFields(source.getClass(), field -> {
//            //将一个字段设置为可读写，主要针对private字段；
//            ReflectionUtils.makeAccessible(field);
//            // 如果字段添加了我们自定义的AutoValue注解
//            if (field.isAnnotationPresent(MongoDbAutoIncKey.class)) {
//                // 设置自增ID
//                field.set(source, getNextAutoId(source.getClass().getSimpleName()));
//            }
//        });
//    }
//
//
//    /**
//     * 获取下一个自增id
//     *
//     * @param collName 字段
//     * @return
//     */
//    private String getNextAutoId(String collName) {
//        Query query = new Query(Criteria.where("collName").is(collName));
//        Update update = new Update();
//        update.inc("seqId", 1);
//        FindAndModifyOptions options = new FindAndModifyOptions();
//        options.upsert(true);
//        options.returnNew(true);
//        AutoIncreaseInfo increaseInfo = mongoTemplate.findAndModify(query, update, options, AutoIncreaseInfo.class);
//        if (null == increaseInfo) {
//            return "1";
//        }
//        return increaseInfo.getSeqId().toString();
//    }
//
//
//}
